package converter;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Stellt die Funktionalitaet des parsens eines proprietaeren Textformates zur Verfuegung.<br>
 * Produkte werden nach Kategorie sortiert und zur weiterverarbeitung zwischengespeichert.<br><br>
 * Nach Abschluss der Verarbeitung werden die Produkte einer Klasse zur Ausgabe der Daten uebergeben.
 * 
 * @author Patrick Bauer
 */
public class CatalogTextParser {
    /**
     * Liste zur Zwischenspeicherung aller eingelener Produkte.
     */
    private ArrayList<XMLElement> elementList = new ArrayList<XMLElement>();
    
    /**
     * Liest die uebergebene Datei aus und verarbeitet diese Zeile fuer Zeile.<br>
     * Je nach Zeileninhalt wird ein neues Produkt angelegt oder diesem Attribute uebergeben.<br><br>
     * Sobald alle Produkte eingelesen wurden, werden diese an ein Writerobjekt uebergeben das diese in einem XML Format ausgibt.
     * 
     * @param fileName der Pfad und Dateiname der einzulesenden Datei
     * @throws FileNotFoundException wird geworfen wenn die angegebene Datei nicht gefunden werden kann
     */
    public void parseFile(String fileName) throws FileNotFoundException {
        BufferedReader reader = null;
        XMLElement element = null;
        String line = null;
        
        reader = new BufferedReader(new FileReader(fileName));

        try {
            line = reader.readLine();
        } catch (IOException ex) {
            Logger.getLogger(CatalogTextParser.class.getName()).log(Level.SEVERE, null, ex);
        }

        while (line != null){

            if(line.compareTo("[DVD]") == 0) {
                if(element != null) {
                    this.elementList.add(element);
                }
                element = new DVDElement();
            } else if(line.compareTo("[Tontraeger]") == 0) {
                if(element != null) {
                    this.elementList.add(element);
                }
                element = new AudioElement();
            } else if(line.compareTo("[eBook]") == 0) {
                if(element != null) {
                    this.elementList.add(element);
                }
                element = new EBookElement();
            } else if(line.compareTo("[Buch]") == 0) {
                if(element != null) {
                    this.elementList.add(element);
                }
                element = new BookElement();
            } else if(line.isEmpty()) {
                if(element != null) {
                    this.elementList.add(element);
                    element = null;
                }
            } else if (element != null) {
                line = line.trim();
                String[] attribute = line.split("=", 2);
                
                if(!attribute[1].isEmpty()) {
                    attribute[1] = attribute[1].replace("&", "&amp;");
                    attribute[1] = attribute[1].replace(">", "&gt;");
                    attribute[1] = attribute[1].replace("<", "&lt;");
                    attribute[1] = attribute[1].replace("\"", "&quot;");
                    attribute[1] = attribute[1].replace("'", "&apos;");
                    
                    String methodName = attribute[0].substring(0,1).toUpperCase() + attribute[0].substring(1);

                    try {
                        Method add = element.getClass().getMethod("set" + methodName, String.class);
                        add.invoke(element, attribute[1]);
                    } catch (Exception ex) {
                        System.out.println(ex.toString());
                    }
                }
            }
            try {
                line = reader.readLine();
            } catch (IOException ex) {
                Logger.getLogger(CatalogTextParser.class.getName()).log(Level.SEVERE, null, ex);
            }
        } 
        
        if(element != null) {
            this.elementList.add(element);
        }
        
        CatalogXMLWriter catalogXMLWriter = new CatalogXMLWriter();
        catalogXMLWriter.write(this.elementList);
    }

    
}
